"""
语音服务接口
"""
from abc import ABC, abstractmethod
from typing import Dict, Any, List, Optional, Tuple, Callable
from app.services.base_service import BaseService


class ISpeechService(BaseService, ABC):
    """
    语音服务接口，定义语音服务的功能
    """
    
    @abstractmethod
    def synthesize(self, text: str, speaker: str, output_dir: Optional[str] = None, filename: Optional[str] = None) -> Optional[str]:
        """
        同步合成语音
        
        @param text: 要合成的文本
        @param speaker: 音色ID，必填参数
        @param output_dir: 输出目录，如果为 None 则使用配置中的app.config_path/speech目录
        @param filename: 输出文件名（不含扩展名），如果为 None 则使用处理后的文本内容
        @return: 生成的音频文件路径，如果合成失败则返回 None
        """
        pass
    
    @abstractmethod
    def synthesize_async(self, 
                       text: str, 
                       speaker: str,
                       output_dir: Optional[str] = None,
                       progress_callback: Optional[Callable[[int, int, str], None]] = None,
                       completion_callback: Optional[Callable[[str, Optional[str]], None]] = None) -> None:
        """
        异步合成语音
        
        @param text: 要合成的文本
        @param speaker: 音色ID，必填参数
        @param output_dir: 输出目录，如果为 None 则使用配置中的app.config_path/speech目录
        @param progress_callback: 进度回调函数，参数为(当前进度, 总进度, 当前处理的文本)
        @param completion_callback: 完成回调函数，参数为(话术文本, 音频文件路径)
        """
        pass
    
    @abstractmethod
    def configure(self, config: Dict[str, Any]) -> None:
        """
        配置语音服务
        
        @param config: 配置字典
        """
        pass
    
    @abstractmethod
    def set_audio_service(self, audio_service) -> None:
        """
        设置音频服务
        
        @param audio_service: 音频服务实例
        """
        pass
    
    @abstractmethod
    def start(self) -> bool:
        """
        启动服务
        
        @return: 是否成功启动
        """
        pass
    
    @abstractmethod
    def stop(self) -> bool:
        """
        停止服务
        
        @return: 是否成功停止
        """
        pass
    
    @abstractmethod
    def is_ready(self) -> bool:
        """
        检查语音服务是否准备就绪
        
        @return: 是否准备就绪
        """
        pass 